/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Rol;
import co.com.sed.model.beans.Usuario;
import co.com.sed.model.beans.RolXUsuario;
import co.com.sed.model.util.Util;

/**
 * @author Mejia
 *
 */
public class RolXUsuarioPeer {

	private static final String BUSCAR_ROLESXUSUARIOS =
		"SELECT id_rol_x_usuario, id_usuario, id_rol FROM rol_x_usuario";

	private static final String BUSCAR_ROLXUSUARIO  =	
		"SELECT id_rol_x_usuario, id_usuario, id_rol FROM rol_x_usuario "+
		"WHERE id_rol_x_usuario = &id_rol_x_usuario";
	
	private static final String BUSCAR_ROLXUSUARIO_POR_ROL  =	
		"SELECT id_rol_x_usuario, id_usuario, id_rol FROM rol_x_usuario "+
		"WHERE id_rol = &id_rol";	

	private static final String INSERTAR_ROLXUSUARIO  =
		"INSERT INTO rol_x_usuario (id_usuario, id_rol ) VALUES "+
		"(&id_usuario, &id_rol)";

	private static final String ACTUALIZAR_ROLXUSUARIO =
		"UPDATE rol_x_usuario "+
		"SET id_usuario = &id_usuario , id_rol = &id_rol  "+
		"WHERE id_rol_x_usuario = &id_rol_x_usuario";

	private static final String ELIMINAR_ROLXUSUARIO =
		"DELETE FROM rol_x_usuario "+
		"WHERE id_rol_x_usuario = &id_rol_x_usuario";

	
	/**
	 * 
	 */
	
	
	/**
	 * Busca en la base de datos todos los registros de la tabla "rol_x_usuario"
	 * 
	 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
	 * 
	 * @return					lista de rol_x_usuario
	 * @see         				RolXUsuario, Statement
	 */
	public static ArrayList<RolXUsuario> buscartodosRolXUsuario(Statement stmt) {
		ArrayList<RolXUsuario> rolesxusuarios = new ArrayList<RolXUsuario>();

		String sql = BUSCAR_ROLESXUSUARIOS; //"SELECT id_rol_x_usuario, observacion, rango FROM rol_x_usuario ";

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					RolXUsuario rxu = new RolXUsuario();

					rxu.setIdRolXUsuario(rs.getInt("id_rol_x_usuario"));
					rxu.setUsuario(new Usuario(rs.getInt("id_usuario")));
					rxu.setRol(new Rol(rs.getInt("id_rol")));
							
					
					
					rolesxusuarios.add(rxu);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}

		return rolesxusuarios;
	}
	
	/** busca en la base de datos un registro de la tabla "rol_x_usuario"
	* 
	* @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
	* @param idRolXUsuario		    id de la rol_x_usuario que se desea cosultar
	* 
	* @return					rol_x_usuario buscada
	* @see         				RolXUsuario, Statement
	*/
	public static RolXUsuario buscarRolXUsuario(Statement stmt, int idRolXUsuario) {
		RolXUsuario rol_x_usuario = new RolXUsuario();

		String sql = BUSCAR_ROLXUSUARIO;
		//"SELECT id_rol_x_usuario, observacion, rango FROM rol_x_usuario "+
		//"WHERE id_rol_x_usuario = &id_rol_x_usuario";
		
		
		// se setean los "parametros"
		sql = sql.replaceAll("&id_rol_x_usuario", "" + idRolXUsuario);
		
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {
									
					rol_x_usuario.setIdRolXUsuario(rs.getInt("id_rol_x_usuario"));
					rol_x_usuario.setUsuario(new Usuario(rs.getInt("id_usuario")));
					rol_x_usuario.setRol(new Rol(rs.getInt("id_rol")));
					
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:" + e.getMessage());
			e.printStackTrace();
		}

		return rol_x_usuario;
	}
	
	/** busca en la base de datos todos los registros de la tabla "RolXUsuario" que pertenescan a un rol
	* 
	* @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
	* 
	* @return					lista de RolXUsuarios
	* @see         				RolXUsuario, Statement
	*/
	
		public static ArrayList<RolXUsuario> buscartodosRolXUsuarioPorRol(Statement stmt, int idRol) {
			ArrayList<RolXUsuario> rolesxusuarios = new ArrayList<RolXUsuario>();

		String sql = BUSCAR_ROLXUSUARIO_POR_ROL;

		// se setean los "parametros"
		sql = sql.replaceAll("&id_Rol", "" + idRol);
		
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					RolXUsuario rxu = new RolXUsuario();

					rxu.setIdRolXUsuario(rs.getInt("id_rol_x_usuario"));
					rxu.setUsuario(new Usuario(rs.getInt("id_usuario")));
					rxu.setRol(new Rol(rs.getInt("id_rol")));
											
					rolesxusuarios.add(rxu);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}

		return rolesxusuarios;
	}
	
	
	/** Inserta una RolXUsuario en la base de datos
	 * 
	 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
	 * @param rol_x_usuario		rol_x_usuario que se va a insertar en la base de datos
	 *  
	 * @return					void
	 * @throws SQLException		si ocurre un error al insertar el registro en la base de datos
	 * 
	 * @see         			DataManager
	 */
	public static int insertarRolXUsuario(Statement stmt, RolXUsuario rol_x_usuario) throws SQLException {
		
		int idNuevaRolXUsuario = -1;
		ResultSet rs = null;
		
		try {
			String sql = INSERTAR_ROLXUSUARIO;
			 //se setean los "parametros": &id_calificacion, &cualitativa, &cuantitativa, &descripcion 
			sql = sql.replaceAll("&id_usuario","" + rol_x_usuario.getUsuario().getIdUsuario())
					 .replaceAll("&id_rol", "" + rol_x_usuario.getRol().getIdRol());
			
			stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
			rs = stmt.getGeneratedKeys();
			
			if (rs.next()) {
				idNuevaRolXUsuario = rs.getInt("id_rol_x_usuario");
				Util.print("nuevo registro: " + idNuevaRolXUsuario);
				
			}
		} finally {
			rs.close();
		}
		
		return idNuevaRolXUsuario;
	}
		
	/** Actualiza una rol_x_usuario en la base de datos
	 * 
	 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
	 * @param rol_x_usuario			rol_x_usuario que se va a actualizar en la base de datos
	 * 
	 * @return					void
	 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
	 * 
	 * @see         			DataManager
	 */
	public static void actualizarRolXUsuario(Statement stmt, RolXUsuario rol_x_usuario) throws SQLException {
		String sql = ACTUALIZAR_ROLXUSUARIO;
		 //se setean los "parametros": &id_rol_x_usuario, &observacion
		sql = sql.replaceAll("&id_rol_x_usuario", "" + rol_x_usuario.getIdRolXUsuario())
				.replaceAll("&id_usuario","" + rol_x_usuario.getUsuario())
				 .replaceAll("&id_rol", "" + rol_x_usuario.getRol());
		
		stmt.executeUpdate(sql);
	}
	
	/** Elimina un rol_x_usuario en la base de datos
	 * 
	 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
	 * @param rol_x_usuario		rol_x_usuario que se va a eliminar en la base de datos
	 * 
	 * @return					void
	 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
	 * 
	 * @see         			DataManager
	 */
	
	public static void eliminarRolXUsuario(Statement stmt, RolXUsuario rol_x_usuario) throws SQLException {
		String sql = ELIMINAR_ROLXUSUARIO;
		// se setean los "id_rol_x_usuario = &id_rol_x_usuario";
		sql = sql.replaceAll("&id_rol_x_usuario", "" + rol_x_usuario.getIdRolXUsuario());

		stmt.executeUpdate(sql);
	}
	
}
